unit uZeigerinstrument;

interface

uses
  Windows, SysUtils, Math, Types, Graphics,
  uPointFloat, uZeichenvorschrift;

type
  TZeigerinstrument = class(TObject)
  private
    FVordergrund:     TBitmap;
    FHintergrund:     TBitmap;

    FVordergrundMask: TBitmap;
    FHintergrundMask: TBitmap;

    FTempBitmap:      TBitmap;

    FZeichenvorschriftenVordergrund: TZeichenvorschriftManager;
    FZeichenvorschriftenHintergrund: TZeichenvorschriftManager;
  public
    constructor Create;
    destructor Destroy; override;

    procedure SetAbmessungen(const Width, Height: Integer);
    procedure ClearVordergrund;
    procedure ClearHintergrund;

    procedure DrawVordergrund;
    procedure DrawHintergrund;

    procedure DrawVordergrundTo(Dest: HDC);
    procedure DrawHintergrundTo(Dest: HDC);

    property Vordergrund:     TBitmap read FVordergrund;
    property Hintergrund:     TBitmap read FHintergrund;
    property VordergrundMask: TBitmap read FVordergrundMask;
    property HintergrundMask: TBitmap read FHintergrundMask;

    property ZeichenvorschriftenVordergrund: TZeichenvorschriftManager read FZeichenvorschriftenVordergrund;
    property ZeichenvorschriftenHintergrund: TZeichenvorschriftManager read FZeichenvorschriftenHintergrund;
  end;

  TZeigerinstrumentZeigerRund = class(TObject)
  private
    FUrsprung:            TPointFloat;
    FZeichenvorschriften: TZeichenvorschriftManager;

    FBitmap:              TBitmap;
    FBitmapMask:          TBitmap;
    FTempBitmap:          TBitmap;

    procedure ClearBitmaps;
  public
    constructor Create;
    destructor Destroy; override;

    procedure SetAbmessungen(const Width, Height: Integer);

    procedure Draw(const Winkel: Double);
    procedure DrawTo(Dest: HDC);

    property Ursprung:            TPointFloat               read FUrsprung            write FUrsprung;
    property Zeichenvorschriften: TZeichenvorschriftManager read FZeichenvorschriften;
  end;

implementation

{******************************************************************************}

constructor TZeigerinstrument.Create;
begin
  Inherited;

  Self.FVordergrund            := TBitmap.Create;
  Self.FVordergrund.Width      := 0;
  Self.FVordergrund.Height     := 0;

  Self.FHintergrund            := TBitmap.Create;
  Self.FHintergrund.Width      := 0;
  Self.FHintergrund.Height     := 0;

  Self.FVordergrundMask        := TBitmap.Create;
  Self.FVordergrundMask.Width  := 0;
  Self.FVordergrundMask.Height := 0;

  Self.FHintergrundMask        := TBitmap.Create;
  Self.FHintergrundMask.Width  := 0;
  Self.FHintergrundMask.Height := 0;

  Self.FTempBitmap             := TBitmap.Create;
  Self.FTempBitmap.Width       := 0;
  Self.FTempBitmap.Height      := 0;

  Self.FZeichenvorschriftenVordergrund := TZeichenvorschriftManager.Create;
  Self.FZeichenvorschriftenHintergrund := TZeichenvorschriftManager.Create;
end;

destructor TZeigerinstrument.Destroy;
begin
  Self.FZeichenvorschriftenVordergrund.Free;
  Self.FZeichenvorschriftenHintergrund.Free;

  Self.FVordergrund.Free;
  Self.FHintergrund.Free;
  Self.FVordergrundMask.Free;
  Self.FHintergrundMask.Free;
  Self.FTempBitmap.Free;

  Inherited;
end;

procedure TZeigerinstrument.SetAbmessungen(const Width, Height: Integer);
begin
  Self.FVordergrund.Width      := Width;
  Self.FVordergrund.Height     := Height;
  Self.FHintergrund.Width      := Width;
  Self.FHintergrund.Height     := Height;
  Self.FVordergrundMask.Width  := Width;
  Self.FVordergrundMask.Height := Height;
  Self.FHintergrundMask.Width  := Width;
  Self.FHintergrundMask.Height := Height;
  Self.FTempBitmap.Width       := Width;
  Self.FTempBitmap.Height      := Height;

  Self.FZeichenvorschriftenVordergrund.SetAbmessungen(Width, Height);
  Self.FZeichenvorschriftenHintergrund.SetAbmessungen(Width, Height);

  Self.DrawVordergrund;
  Self.DrawHintergrund;
end;

procedure TZeigerinstrument.ClearVordergrund;
begin
  Self.FZeichenvorschriftenVordergrund.Clear;
end;

procedure TZeigerinstrument.ClearHintergrund;
begin
  Self.FZeichenvorschriftenHintergrund.Clear;
end;

procedure TZeigerinstrument.DrawVordergrund;
begin
  With Self.FVordergrund Do
  begin
    Canvas.Brush.Color := RGB(255, 0, 255);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;
  With Self.FVordergrundMask Do
  begin
    Canvas.Brush.Color := RGB(0, 0, 0);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;

  Self.FZeichenvorschriftenVordergrund.DrawAll(Self.FVordergrund.Canvas, Self.FVordergrundMask.Canvas, PointFloat(0, 0), 0);
end;

procedure TZeigerinstrument.DrawHintergrund;
begin
  With Self.FHintergrund Do
  begin
    Canvas.Brush.Color := RGB(255, 0, 255);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;
  With Self.FHintergrundMask Do
  begin
    Canvas.Brush.Color := RGB(0, 0, 0);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;

  Self.FZeichenvorschriftenHintergrund.DrawAll(Self.FHintergrund.Canvas, Self.FHintergrundMask.Canvas, PointFloat(0, 0), 0);
end;

procedure TZeigerinstrument.DrawVordergrundTo(Dest: HDC);
begin
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FVordergrundMask.Canvas.Handle, 0, 0, NOTSRCCOPY);
  BitBlt(Dest, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FVordergrund.Canvas.Handle, 0, 0, SRCCOPY);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FVordergrundMask.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Dest, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCINVERT);
end;

procedure TZeigerinstrument.DrawHintergrundTo(Dest: HDC);
begin
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FHintergrundMask.Canvas.Handle, 0, 0, NOTSRCCOPY);
  BitBlt(Dest, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FHintergrund.Canvas.Handle, 0, 0, SRCCOPY);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FHintergrundMask.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Dest, 0, 0, Self.FVordergrund.Width, Self.FVordergrund.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCINVERT);
end;

{******************************************************************************}

constructor TZeigerinstrumentZeigerRund.Create;
begin
  Inherited;

  Self.FUrsprung.X := 0;
  Self.FUrsprung.Y := 0;
  Self.FZeichenvorschriften := TZeichenvorschriftManager.Create;

  Self.FBitmap            := TBitmap.Create;
  Self.FBitmap.Width      := 0;
  Self.FBitmap.Height     := 0;

  Self.FBitmapMask        := TBitmap.Create;
  Self.FBitmapMask.Width  := 0;
  Self.FBitmapMask.Height := 0;

  Self.FTempBitmap        := TBitmap.Create;
  Self.FTempBitmap.Width  := 0;
  Self.FTempBitmap.Height := 0;
end;

destructor TZeigerinstrumentZeigerRund.Destroy;
begin
  Self.FZeichenvorschriften.Free;

  Self.FBitmap.Free;
  Self.FBitmapMask.Free;
  Self.FTempBitmap.Free;

  Inherited;
end;

procedure TZeigerinstrumentZeigerRund.SetAbmessungen(const Width, Height: Integer);
begin
  Self.FBitmap.Width      := Width;
  Self.FBitmap.Height     := Height;
  Self.FBitmapMask.Width  := Width;
  Self.FBitmapMask.Height := Height;
  Self.FTempBitmap.Width  := Width;
  Self.FTempBitmap.Height := Height;

  Self.FZeichenvorschriften.SetAbmessungen(Width, Height);

  Self.ClearBitmaps;
end;

procedure TZeigerinstrumentZeigerRund.ClearBitmaps;
begin
  With Self.FBitmap Do
  begin
    Canvas.Brush.Color := RGB(255, 0, 255);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;
  With Self.FBitmapMask Do
  begin
    Canvas.Brush.Color := RGB(0, 0, 0);
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;
end;

procedure TZeigerinstrumentZeigerRund.Draw(const Winkel: Double);
begin
  Self.ClearBitmaps;
  Self.FZeichenvorschriften.DrawAll(Self.FBitmap.Canvas, Self.FBitmapMask.Canvas, Self.FUrsprung, Winkel);
end;

procedure TZeigerinstrumentZeigerRund.DrawTo(Dest: HDC);
begin
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FBitmap.Width, Self.FBitmap.Height,
    Self.FBitmapMask.Canvas.Handle, 0, 0, NOTSRCCOPY);
  BitBlt(Dest, 0, 0, Self.FBitmap.Width, Self.FBitmap.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FBitmap.Width, Self.FBitmap.Height,
    Self.FBitmap.Canvas.Handle, 0, 0, SRCCOPY);
  BitBlt(Self.FTempBitmap.Canvas.Handle, 0, 0, Self.FBitmap.Width, Self.FBitmap.Height,
    Self.FBitmapMask.Canvas.Handle, 0, 0, SRCAND);
  BitBlt(Dest, 0, 0, Self.FBitmap.Width, Self.FBitmap.Height,
    Self.FTempBitmap.Canvas.Handle, 0, 0, SRCINVERT);
end;

end.
